home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Cream of the Crop 26
/
Cream of the Crop 26.iso
/
program
/
ddj0897.zip
/
RCSC.ASC
< prev
next >
Wrap
Text File
|
1997-06-20
|
4KB
|
300 lines
_Retargetable Concurrent Small C_
by Andy Yuen
Example 1:
(a)
macroname(arg1, arg2,..., argn)
(b)
define(`OPxy',
`MOV A,$3
ifelse(len($5), 0, `$1 A', `$1 A,$5')
MOV $3,A
MOV A,$4
ifelse(len($6), 0, `$1 A', `$2 A,$6')
MOV $4,A')
Example 2:
(a)
OPxy(ADD, ADDC, R3, R2, R5, R4)
(b)
MOV A,R3
ADD A,R5
MOV R3,A
MOV A,R2
ADDC A,R4
MOV R2,A
Example 3:
__intr_1:
LCALL __handler ;;common interrupt handler
DW __dodelta ;;user interrupt function
DW 1 ;;interrupt number
Example 4: (a) 80x86 version; (b) 8051 version
(a)
vargfunc(argc) int argc; {
int *nxtarg;
int *ptr, *ctl;
/* get pointer to first argument */
nxtarg = CCARGC() + &argc - 1;
...
/* get first argument */
ptr = *nxtarg--;
...
/* get next argument */
ctl = *nxtarg--;
...
}
(b)
vargfunc(argc) int argc; {
int *nxtarg;
int *ptr, *ctl;
/* get pointer to first argument */
nxtarg = &argc - CCARGC() + 1;
...
/* get first argument */
ptr = *nxtarg++;
...
/* get next argument */
ctl = *nxtarg++;
...
}
Example 5:
(a)
vargfunc(argc) int argc; {
va_list nxtarg;
int *ptr, *ctl;
/* get pointer to first argument */
va_start(nxtarg, argc);
...
/* get first argument */
ptr = va_arg(nxtarg, int);
...
/* get next argument */
ctl = va_arg(nxtarg, int);
...
}
Listing One
/* ** copy t to s */
strcpy(s, t) char *s, *t; {
char *d;
d = s;
while (*s++ = *t++) ;
return (d);
}
Listing Two
TOSEG(2)
CSCEXTRN
ENDSEG(2)
TOSEG(1)
ENDSEG(1)
TOSEG(2)
DECLPUBLIC(_strcpy, 2)
ENTER
ADDSP(-2)
GETw1s(6)
POINT2s(-2)
PUTwp1
LABm(_2:)
POINT2s(6)
GETw1p(0)
INCwp
PUSH1
POINT2s(4)
GETw1p(0)
INCwp
MOVE21
GETb1p(0)
POP2
PUTbp1
NE10f(_3)
JMPm(_2)
LABm(_3:)
GETw1s(-2)
RETURN(2)
ENDSEG(2)
END
Listing Three
CODE SEGMENT PUBLIC
ASSUME CS:CODE, SS:DATA, DS:DATA
extrn __eq: near
extrn __ne: near
extrn __le: near
extrn __lt: near
extrn __ge: near
extrn __gt: near
extrn __ule: near
extrn __ult: near
extrn __uge: near
extrn __ugt: near
extrn __lneg: near
extrn __switch: near
CODE ENDS
DATA SEGMENT PUBLIC
DATA ENDS
CODE SEGMENT PUBLIC
ASSUME CS:CODE, SS:DATA, DS:DATA
PUBLIC _strcpy
_strcpy:
PUSH BP
MOV BP,SP
ADD SP,-2
MOV AX,6[BP]
LEA BX,-2[BP]
MOV [BX],AX
_2:
LEA BX,6[BP]
MOV AX,[BX]
INC WORD PTR [BX]
PUSH AX
LEA BX,4[BP]
MOV AX,[BX]
INC WORD PTR [BX]
MOV BX,AX
MOV AL,[BX]
CBW
POP BX
MOV [BX],AL
OR AX,AX
JNE $+5
JMP _3
JMP _2
_3:
MOV AX,-2[BP]
MOV SP,BP
POP BP
RET
CODE ENDS
END
Listing Four
SEG CODE
include "runtime.i"
SEG XDATA AT MNAME_var_at
SEG CODE
PUBLIC _strcpy:
;;ENTER
POP B
POP ACC
LCALL __enter
;;ADDSP(-2)
MOV DPTR,# 2
LCALL __addsp
;;GETw1s(6)
MOV DPTR,# -3
LCALL __getw1s
;;POINT2s(-2)
MOV DPTR,# 5
LCALL __point2s
;;PUTwp1
MOV DPL,R5
MOV DPH,R4
MOV A,R2
MOVX @DPTR,A
INC DPTR
MOV A,R3
MOVX @DPTR,A
_2:
;;POINT2s(6)
MOV DPTR,# -3
LCALL __point2s
;;GETw1p(0)
MOV DPTR,# 0
LCALL __getw1p
;;INCwp
MOV DPL,R5
MOV DPH,R4
INC DPTR
MOVX A,@DPTR
ADD A,#1
MOVX @DPTR,A
MOV DPL,R5
MOV DPH,R4
MOVX A,@DPTR
ADDC A,#0
MOVX @DPTR,A
;;PUSH1
LCALL __push1
;;POINT2s(4)
MOV DPTR,# -1
LCALL __point2s
;;GETw1p(0)
MOV DPTR,# 0
LCALL __getw1p
;;INCwp
MOV DPL,R5
MOV DPH,R4
INC DPTR
MOVX A,@DPTR
ADD A,#1
MOVX @DPTR,A
MOV DPL,R5
MOV DPH,R4
MOVX A,@DPTR
ADDC A,#0
MOVX @DPTR,A
;;MOVE21
MOV A,R3
MOV R5,A
MOV A,R2
MOV R4,A
;;GETb1p(0)
MOV DPTR,# 0
LCALL __getb1p
;;POP2
LCALL __pop2
;;PUTbp1
MOV DPL,R5
MOV DPH,R4
MOV A,R3
MOVX @DPTR,A
;;NE10f
MOV A,R3
ORL A,R2
JNZ $+5
LJMP _3
;;JMPm(_2)
LJMP _2
_3:
;;GETw1s(-2)
MOV DPTR,# 5
LCALL __getw1s
;;RETURN(2)
MOV DPTR,# -2-4
LJMP __return
END